package ar.pmt.vista.manager.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import ar.pmt.modelo.beans.Peticion;
import ar.pmt.modelo.beans.Tarea;
import ar.pmt.modelo.beans.comparators.TareaOrdenComparator;
import ar.pmt.vista.beansComplejos.TareaBean;
import ar.pmt.vista.beansComplejos.VariablesTareasBean;
import ar.pmt.vista.utils.Utils;
/**
 * Singleton
 *
 * @author gburgener
 *
 */
public class TareaManager {

	/**
	 * en base a una peticion se recorren sus tareas y se iran rellenando beans de vistas 
	 * que representan el estado de la tarea en cada uno de los dias que duro la peticion
	 * @param peticion
	 * @return Collection<TareaBean>
	 * @throws Exception
	 */
   public static Collection<TareaBean> getTareas(Peticion peticion) throws Exception{
		Collection<TareaBean> tareasView = new ArrayList<TareaBean>();
		List<Tarea> tareas = (List<Tarea>) peticion.getTareas();
		Collections.sort(tareas, new TareaOrdenComparator());

		for (Iterator<Tarea> iterator = tareas.iterator(); iterator.hasNext();) {
			Tarea tareaModel = iterator.next();
			tareasView.add(tareaModelATareaVista(peticion, tareaModel));
		}

		return tareasView;
   }

   /**
    * pasaje de un bean Tarea del modelo a un bean de vista Tarea, con sus correspondientes 
    * estados por cada dia que haya durado la peticion(estimado, avance, costo)
    * @param peticion
    * @param tarea
    * @return TareaBean
    * @throws Exception
    */
   private static TareaBean tareaModelATareaVista(Peticion peticion, Tarea tarea) throws Exception{
	      TareaBean tareaView = new TareaBean();
	      tareaView.setId(new Integer(tarea.getIdImportacion()));
	      tareaView.setEstimado(tarea.obtenerTotalHorasEstimadas());
	      tareaView.setAvance(tarea.obtenerAvance());
	      tareaView.setNombre(tarea.getDescripcion());
	      tareaView.setVariables(crearVariablesXDia(peticion, tarea));
	      tareaView.getTotalVariables().setCosto(tarea.obtenerCosto());
	      tareaView.getTotalVariables().setCompletado(tarea.obtenerPorcentajeAvance());
	      tareaView.getTotalVariables().setEstimado(tarea.obtenerTotalHorasEstimadas());
	      return tareaView;
   }

   /**
    * metodo que retorna una collection de VariablesTareasBean, cada uno de estos beans representa el 
    * estado de una tarea en un dia determinado de la peticon. 
    * Dicho estado esta representado por: horas estimadas para ese dia, avance hasta ese dia, costo en ese dia
    * @param peticion
    * @param tarea
    * @return Collection<VariablesTareasBean>
    * @throws Exception
    */
   private static Collection<VariablesTareasBean> crearVariablesXDia(Peticion peticion, Tarea tarea) throws Exception{
      Collection<VariablesTareasBean> col = new ArrayList<VariablesTareasBean>();
      
      int cantidadDiasPeticion = peticion.obtenerDiasDuracionPeticion();
      
      for(int i=0;i<cantidadDiasPeticion;i++){
         VariablesTareasBean estadoDia = new VariablesTareasBean();
         
         Calendar diaEnPeticion = (Calendar) peticion.getFechaInicio().clone();
         diaEnPeticion.add(Calendar.DAY_OF_MONTH, i);
         estadoDia.setFecha(diaEnPeticion);
         
         estadoDia.setCompletado(tarea.obtenerAvance(diaEnPeticion)*100/tarea.obtenerTotalHorasEstimadas());
         estadoDia.setCosto(tarea.obtenerCostoEnDiaDeterminado(diaEnPeticion));
         estadoDia.setEstimado(tarea.obtenerTotalEstimadoParaDiaDeterminado(diaEnPeticion));
         
         //Calculo cuanto avanzo la tarea en el dia de hoy, para eso se debe restar el avance hasta el dia anterior, 
         //lo que importa es el avance exclusivo en un dia determinado
         Calendar diaAnteriorEnPeticion = (Calendar) diaEnPeticion.clone();
         diaAnteriorEnPeticion.add(Calendar.DAY_OF_MONTH, -1);
         Float avanceExclusivoDelDia = tarea.obtenerAvance(diaEnPeticion)-tarea.obtenerAvance(diaAnteriorEnPeticion);
         if (avanceExclusivoDelDia < 0) avanceExclusivoDelDia = 0f;
         
         estadoDia.setValorGanadoEnElDia(avanceExclusivoDelDia);
         
         col.add(estadoDia);
      }
      return col;
   }

}
